package ma.xin.shi.arxml.comm;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 * UUIDGenerator 是一个工具类，用于生成各种格式的 UUID。
 */
public class UUIDGenerator {

    /**
     * 生成一个标准格式的随机 UUID（版本 4），不带大括号。
     * 示例输出：2a4fc00d-6bf2-40f6-bda3-296f27ae5938
     *
     * @return 标准 UUID 字符串
     */
    public static String generateUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 生成一个带大括号的随机 UUID（版本 4）。
     * 示例输出：{2a4fc00d-6bf2-40f6-bda3-296f27ae5938}
     *
     * @return 带 {} 的 UUID 字符串
     */
    public static String generateUUIDEx() {
        return "{" + UUID.randomUUID().toString() + "}";
    }

    /**
     * 生成基于输入字符串的固定 UUID（模拟 UUID version 3/5）。
     * 输入相同，则输出相同，适用于需要可预测 UUID 的场景。
     *
     * @param input 输入字符串
     * @return 固定格式的 UUID 字符串
     */
    public static String generateUUIDFromString(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(input.getBytes(StandardCharsets.UTF_8));

            // 使用前16字节构造 UUID（模拟 version 3/5）
            long mostSigBits = 0;
            long leastSigBits = 0;

            for (int i = 0; i < 8; i++) {
                mostSigBits = (mostSigBits << 8) | (hash[i] & 0xFF);
            }
            for (int i = 8; i < 16; i++) {
                leastSigBits = (leastSigBits << 8) | (hash[i] & 0xFF);
            }

            // 强制设置 UUID 版本为 5（基于 SHA-1 的命名空间）
            mostSigBits &= 0xFFFFFFFFFFFF0FFFL;
            mostSigBits |= 0x0000000000005000L;

            return new UUID(mostSigBits, leastSigBits).toString();

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("无法生成基于内容的 UUID：" + e.getMessage(), e);
        }
    }
}
